home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Talking Clock Pro™ 2.0.1 / Talking Clock Pro Source / Controller / Source / window.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-04  |  7.1 KB  |  393 lines  |  [TEXT/CWIE]

  1. /*
  2.  * window.c
  3.  */
  4.  
  5. #include "window.h"
  6. #include "x.h"
  7. #include "menu.h"
  8. #include "str.h"
  9.  
  10.  
  11. #define MY_KIND 4711
  12.  
  13.  
  14. static Boolean inFront = 1 ;
  15. Boolean quit = 0 ;
  16. long gSleep = 0x7fffffff ;
  17. RgnHandle gMouse = NULL ;
  18. EventRecord gEvent ;
  19. Rect gDragLimit ;
  20. Rect gSizeLimit ;
  21. DefWindowRec app ;
  22. static WindowPtr downWindow = NULL ;
  23. short notificationLevel = 2 ;
  24. Boolean notificationSound = 1 ;
  25.  
  26.  
  27. WindowPtr
  28. MakeWindow ( FSSpec * file , DefWindowRec * rec ) {
  29.  
  30. WindowPtr wp ;
  31. Ptr h ;
  32.  
  33.     wp = GetNewWindow ( rec -> windID , NULL , ( WindowPtr ) -1 ) ;
  34.     FailNil ( wp ) ;
  35.     h = NewPtrClear ( sizeof ( DefWindowRec ) ) ;
  36.     FailNil ( h ) ;
  37.     * ( DefWindowRec * ) h = * rec ;
  38.     SetWRefCon ( wp , ( long ) h ) ;
  39.     ( ( WindowPeek ) wp ) -> windowKind = MY_KIND ;
  40.     TRY {
  41.         if ( rec -> OnCreate ) {
  42.             FailErr ( ( * ( rec -> OnCreate ) ) ( wp ,
  43.                 & ( ( ( DefWindowRec * ) h ) -> data ) , file ) ) ;
  44.         } else {
  45.             SelectWindow ( wp ) ;
  46.         }
  47.     } CATCH {
  48.         DisposeWindow ( wp ) ;
  49.         DisposePtr ( h ) ;
  50.     } DONE ;
  51.  
  52.     return wp ;
  53. }
  54.  
  55.  
  56. OSErr
  57. DestroyWindow ( WindowPtr wp ) {
  58.  
  59. short err = 0 ;
  60.  
  61.     if ( wp == downWindow ) {
  62.         downWindow = NULL ;
  63.     }
  64.     if ( ( ( WindowPeek ) wp ) -> windowKind == MY_KIND ) {
  65.     DefWindowRec * rec = ( DefWindowRec * ) GetWRefCon ( wp ) ;
  66.         if ( rec -> OnDestroy ) {
  67.             err = ( * ( rec -> OnDestroy ) ) ( wp , rec -> data ) ;
  68.         } else {
  69.             DisposeWindow ( wp ) ;
  70.         }
  71.         if ( ! err ) {
  72.             DisposePtr ( ( Ptr ) rec ) ;
  73.         }
  74.     }
  75.     return err ;
  76. }
  77.  
  78.  
  79. DefWindowRec *
  80. GetFrontWindow ( WindowPtr * wp ) {
  81.  
  82.     * wp = FrontWindow ( ) ;
  83.     return RecFromWindow ( * wp ) ;
  84. }
  85.  
  86.  
  87. DefWindowRec *
  88. RecFromWindow ( WindowPtr wp ) {
  89.     if ( ! wp ) {
  90.         return NULL ;
  91.     }
  92.     if ( ( ( WindowPeek ) wp ) -> windowKind != MY_KIND ) {
  93.         return NULL ;
  94.     }
  95.     return ( DefWindowRec * ) GetWRefCon ( wp ) ;
  96. }
  97.  
  98.  
  99. void
  100. IdleFrontWindow ( void ) {
  101. WindowPtr wp = NULL ;
  102. DefWindowRec * rec = GetFrontWindow ( & wp ) ;
  103.     if ( rec && rec -> DoIdle ) {
  104.         FailNil ( wp ) ;
  105.         SetPort ( wp ) ;
  106.         FailErr ( ( * ( rec -> DoIdle ) ) ( wp , rec -> data , & gSleep ) ) ;
  107.     } else {
  108.         FailErr ( ( * app . DoIdle ) ( wp , app . data , & gSleep ) ) ;
  109.     }
  110. }
  111.  
  112.  
  113. static void
  114. MouseDown ( EventRecord * event ) {
  115.  
  116. WindowPtr wp = NULL ;
  117. short code ;
  118. DefWindowRec * rec = NULL ;
  119.  
  120.     code = FindWindow ( event -> where , & wp ) ;
  121.     rec = RecFromWindow ( wp ) ;
  122.     downWindow = wp ;
  123.  
  124.     switch ( code ) {
  125.     case inContent :
  126.         if ( rec -> DoMouseDown ) {
  127.             SetPort ( wp ) ;
  128.             GlobalToLocal ( & ( event -> where ) ) ;
  129.             FailErr ( ( * ( rec -> DoMouseDown ) ) ( wp , rec -> data , event ) ) ;
  130.         } else {
  131.             FailErr ( ( * app . DoMouseDown ) ( wp , app . data , event ) ) ;
  132.         }
  133.         break ;
  134.     case inSysWindow :
  135.         SystemClick ( event , wp ) ;
  136.         break ;
  137.     case inGoAway :
  138.         if ( TrackGoAway ( wp , event -> where ) ) {
  139.             FailErr ( DestroyWindow ( wp ) ) ;
  140.         }
  141.         break ;
  142.     case inDrag :
  143.         DragWindow ( wp , event -> where , & gDragLimit ) ;
  144.         break ;
  145.     case inGrow :
  146.         {    long res = GrowWindow ( wp , event -> where , & gSizeLimit ) ;
  147.             if ( res ) {
  148.                 SizeWindow ( wp , res & 0xffff , ( res >> 16 ) & 0xffff , 1 ) ;
  149.             }
  150.         }
  151.         break ;
  152.     case inMenuBar :
  153.         DoMenu ( event ) ;
  154.         break ;
  155.     case inZoomIn :
  156.     case inZoomOut :
  157.     case inDesk :
  158.     default :
  159.         break ;
  160.     }
  161. }
  162.  
  163.  
  164. static void
  165. MouseUp ( EventRecord * event ) {
  166.  
  167. WindowPtr wp = NULL ;
  168. short code ;
  169. DefWindowRec * rec = NULL ;
  170.  
  171.     code = FindWindow ( event -> where , & wp ) ;
  172.     rec = RecFromWindow ( wp ) ;
  173.  
  174.     if ( downWindow && ( downWindow == wp ) ) {
  175.     WindowPtr frontWin ;
  176.     ( void ) GetFrontWindow ( & frontWin ) ;
  177.         if ( frontWin != wp ) {
  178.             SelectWindow ( wp ) ;
  179.         }
  180.     }
  181.     downWindow = NULL ;
  182.  
  183.     switch ( code ) {
  184.     case inContent :
  185.         if ( rec -> DoMouseUp ) {
  186.             SetPort ( wp ) ;
  187.             GlobalToLocal ( & ( event -> where ) ) ;
  188.             FailErr ( ( * ( rec -> DoMouseUp ) ) ( wp , rec -> data , event ) ) ;
  189.             break ;
  190.         } else {
  191.             FailErr ( ( * app . DoMouseUp ) ( wp , rec -> data , event ) ) ;
  192.         }
  193.         break ;
  194.     case inSysWindow :
  195.     case inGoAway :
  196.     case inDrag :
  197.     case inGrow :
  198.     case inMenuBar :
  199.     case inZoomIn :
  200.     case inZoomOut :
  201.     case inDesk :
  202.     default :
  203.         break ;
  204.     }
  205. }
  206.  
  207.  
  208. static void
  209. WinKey ( EventRecord * event , WindowPtr wp , DefWindowRec * rec ) {
  210.  
  211.     if ( wp ) {
  212.         SetPort ( wp ) ;
  213.     }
  214.     if ( rec && rec -> DoKeyDown ) {
  215.         FailErr ( ( * ( rec -> DoKeyDown ) ) ( wp , rec -> data , event ) ) ;
  216.     } else {
  217.         FailErr ( ( * app . DoKeyDown ) ( wp , app . data , event ) ) ;
  218.     }
  219. }
  220.  
  221.  
  222. static void
  223. KeyDown ( EventRecord * event ) {
  224.  
  225. WindowPtr wp = NULL ;
  226. DefWindowRec * rec = GetFrontWindow ( & wp ) ;
  227. long sel ;
  228.  
  229.     if ( event -> modifiers & cmdKey ) {
  230.         UpdateWinMenus ( wp , rec ) ;
  231.         sel = MenuKey ( event -> message & 0xff ) ;
  232.         if ( sel ) {
  233.             SelectMenu ( sel ) ;
  234.             return ;
  235.         }
  236.     }
  237.     WinKey ( event , wp , rec ) ;
  238. }
  239.  
  240.  
  241. static void
  242. AutoKey ( EventRecord * event ) {
  243.  
  244. WindowPtr wp = NULL ;
  245. DefWindowRec * rec = GetFrontWindow ( & wp ) ;
  246.  
  247.     WinKey ( event , wp , rec ) ;
  248. }
  249.  
  250.  
  251. static void
  252. ActivateEvt ( EventRecord * event ) {
  253.  
  254. WindowPtr wp = ( WindowPtr ) event -> message ;
  255. DefWindowRec * rec = RecFromWindow ( wp ) ;
  256.  
  257.     SetPort ( wp ) ;
  258.     if ( rec && rec -> DoActivate ) {
  259.         FailErr ( ( * ( rec -> DoActivate ) ) ( wp , rec -> data , event ) ) ;
  260.     } else {
  261.         FailErr ( ( * app . DoActivate ) ( wp , app . data , event ) ) ;
  262.     }
  263. }
  264.  
  265.  
  266. static void
  267. UpdateEvt ( EventRecord * event ) {
  268.  
  269. WindowPtr wp = ( WindowPtr ) event -> message ;
  270. DefWindowRec * rec = RecFromWindow ( wp ) ;
  271.  
  272.     BeginUpdate ( wp ) ;
  273.     SetPort ( wp ) ;
  274.     if ( rec && rec -> DoUpdate ) {
  275.         FailErr ( ( * ( rec -> DoUpdate ) ) ( wp , rec -> data , event ) ) ;
  276.     } else {
  277.         FailErr ( ( * app . DoUpdate ) ( wp , app . data , event ) ) ;
  278.     }
  279.     EndUpdate ( wp ) ;
  280. }
  281.  
  282.  
  283. static void
  284. DiskEvt ( EventRecord * event ) {
  285.  
  286.     if ( event -> message & 0xffff0000 ) {
  287.     Point p = { 120 , 100 } ;
  288.         FailErr ( DIBadMount ( p , event -> message ) ) ;
  289.     }
  290. }
  291.  
  292.  
  293. static void
  294. OSEvt ( EventRecord * event ) {
  295.  
  296. WindowPtr wp = NULL ;
  297. DefWindowRec * rec = GetFrontWindow ( & wp ) ;
  298.  
  299.     if ( rec && rec -> DoSwitch ) {
  300.         FailErr ( ( * ( rec -> DoSwitch ) ) ( wp , rec -> data , event ) ) ;
  301.     } else {
  302.         FailErr ( ( * app . DoSwitch ) ( wp , rec -> data , event ) ) ;
  303.     }
  304.     if ( event -> message & 0xff000000 == 0x01000000 ) { /* Suspend/Resume */
  305.         if ( event -> message & 1 ) {
  306.             inFront = 1 ;
  307.         } else {
  308.             inFront = 0 ;
  309.         }
  310.     }
  311. }
  312.  
  313.  
  314. static void
  315. HighLevelEvent ( EventRecord * event ) {
  316.  
  317. short err ;
  318.  
  319.     err = AEProcessAppleEvent ( event ) ;
  320. }
  321.  
  322.  
  323. void
  324. HandleEvent ( EventRecord * event ) {
  325.  
  326.     switch ( event -> what ) {
  327.  
  328.     case mouseDown :
  329.         MouseDown ( event ) ;
  330.         break ;
  331.     case mouseUp :
  332.         MouseUp ( event ) ;
  333.         break ;
  334.     case keyDown :
  335.         KeyDown ( event ) ;
  336.         break ;
  337.     case autoKey :
  338.         AutoKey ( event ) ;
  339.         break ;
  340.     case activateEvt :
  341.         ActivateEvt ( event ) ;
  342.         break ;
  343.     case updateEvt :
  344.         UpdateEvt ( event ) ;
  345.         break ;
  346.     case diskEvt :
  347.         DiskEvt ( event ) ;
  348.         break ;
  349.     case osEvt :
  350.         OSEvt ( event ) ;
  351.         break ;
  352.     case kHighLevelEvent :
  353.         HighLevelEvent ( event ) ;
  354.         break ;
  355.     default :
  356.         IdleFrontWindow ( ) ;
  357.         break ;
  358.     }
  359. }
  360.  
  361.  
  362. void
  363. DriveWindow ( void ) {
  364.  
  365.     if ( WaitNextEvent ( -1 , & gEvent , gSleep , gMouse ) ) {
  366.         gSleep = 0 ;
  367.         HandleEvent ( & gEvent ) ;
  368.     } else {
  369.         gSleep = 0x7fffffff ;
  370.         IdleFrontWindow ( ) ;
  371.     }
  372. }
  373.  
  374.  
  375. Boolean
  376. InFront ( void ) {
  377.     return inFront ;
  378. }
  379.  
  380.  
  381. static NMRec theRec ;
  382.  
  383. void
  384. Notify ( void ) {
  385.     ClearMem ( & theRec , sizeof ( theRec ) ) ;
  386. }
  387.  
  388.  
  389. void
  390. DeNotify ( void ) {
  391. }
  392.  
  393.